//============================================================================================
/**
 * @file	pkthln_ev_move_common.c
 * @brief	ポケスロン競技　ムーブ共通
 * @author	Nozomu Saito
 */
//============================================================================================

#include "pkthln_ev_move_common.h"
#include "communication/comm_tool.h"
typedef enum {
	MOVE_SEQ_MAIN,
	MOVE_SEQ_SYNCSTART,
	MOVE_SEQ_SYNCWAIT,
}MOVE_SEQ;

typedef struct PTH_MOVE_CNT_tag{
	u32			SynchroID;			//同期ＩＤ
	MOVE_SEQ	MainSeq;			//メインシーケンスナンバー

	const PKTHLN_EV_MOVE_FUNC *MoveTbl;

	u8			SubSeq;				//ムーブ関数内サブシーケンサ
	u8			MoveTblIdx;			//ムーブ関数のテーブルインデックス
	u8			MoveTblIdxReq;		//ムーブ関数のテーブル変更リクエストインデックス
	u8			MoveChgReqFlg;		//ムーブ関数の変更リクエストフラグ

	u8			CallBackWaitFlg;	//通信コールバック待ちフラグ

}PTH_MOVE_CNT;

//--------------------------------------------------------------------------------------------
/**
 * ムーブ関数
 *
 * @param	work			ワーク
 * @param	param			パラメータ
 *
 * @return	BOOL
 */
//--------------------------------------------------------------------------------------------
BOOL PKTHLN_EV_DefaultMoveFunc(PKTHLN_PTR work, void *param)
{
	PKTHLN_EV_MOVE_FUNC move;
	PTH_MOVE_CNT_PTR cnt = NULL;//PTFrame_GetMoveCntPtr( work );

	if (cnt->MoveTbl == NULL){
		return TRUE;
	}

	move = cnt->MoveTbl[cnt->MoveTblIdx];

	switch(cnt->MainSeq){
	case MOVE_SEQ_MAIN:
		if(move == NULL){
			break;
		}

		if (!cnt->CallBackWaitFlg){
			//メイン呼び出し
			(move)(work,&cnt->SubSeq);
		}

		// リクエストシーケンスを設定
		if( cnt->MoveChgReqFlg ){
			cnt->MoveTblIdx = cnt->MoveTblIdxReq;
			cnt->MoveChgReqFlg = 0;
			//サブシーケンサリセット
			cnt->SubSeq = 0;
			//コールバックウェイトリセット
			cnt->CallBackWaitFlg = 0;
		}

		//通信時
		if(PTFrame_GetGameType(work) == PKTHLN_GAME_COMM){
			//通信同期チェック
			if(cnt->SynchroID != SYNCHROID_NONE){
				//通信同期に入る
				cnt->MainSeq = MOVE_SEQ_SYNCSTART;
			}
		}
		break;
	case MOVE_SEQ_SYNCSTART:
		CommTimingSyncStart(cnt->SynchroID);
		cnt->MainSeq = MOVE_SEQ_SYNCWAIT;
		break;
	case MOVE_SEQ_SYNCWAIT:
		if(!CommIsTimingSync(cnt->SynchroID)){
			break;
		}
		//通信同期終了&次のシーケンスへ
		cnt->MainSeq = MOVE_SEQ_MAIN;
		cnt->SynchroID = SYNCHROID_NONE;
		break;
	}

	return TRUE;
}

//--------------------------------------------------------------------------------------------
/**
 * メモリーアロケーション
 *
 * @param	inHeapID	ヒープＩＤ
 * @param	*MoveTbl	ムーブテーブル
 *
 * @return
 */
//--------------------------------------------------------------------------------------------
PTH_MOVE_CNT_PTR PKTHLN_EV_Alloc(const int inHeapID, const PKTHLN_EV_MOVE_FUNC *MoveTbl)
{
	PTH_MOVE_CNT_PTR ptr;
	ptr = sys_AllocMemory(inHeapID, sizeof(PTH_MOVE_CNT));
	ptr->MoveTbl = MoveTbl;
	ptr->MainSeq = MOVE_SEQ_MAIN;
	ptr->SynchroID = SYNCHROID_NONE;

	ptr->SubSeq = 0;
	ptr->MoveTblIdx = 0;
	ptr->MoveTblIdxReq = 0;
	ptr->MoveChgReqFlg = 0;
	ptr->CallBackWaitFlg = 0;
	return ptr;
}

//--------------------------------------------------------------------------------------------
/**
 * 次ムーブ関数インデックスセット
 *
 * @param	cnt_ptr		管理ポインタ
 * @param	inIndex		インデックス
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PKTHLN_EV_SetNextMoveTblIdx(PTH_MOVE_CNT_PTR cnt_ptr, const int inIndex)
{
	cnt_ptr->MoveChgReqFlg = 1;
	cnt_ptr->MoveTblIdxReq = inIndex;
}

//--------------------------------------------------------------------------------------------
/**
 * 通信同期待ちセット
 *
 * @param	cnt_ptr		管理ポインタ
 * @param	inID		同期待ちＩＤ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void  PKTHLN_EV_SetSynchroID(PTH_MOVE_CNT_PTR cnt_ptr, const int inID)
{
	cnt_ptr->SynchroID = inID;
}

//--------------------------------------------------------------------------------------------
/**
 * 通信コールバック待ちにする
 *
 * @param	cnt_ptr		管理ポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PKTHLN_EV_CallBackWaitOn(PTH_MOVE_CNT_PTR cnt_ptr)
{
	cnt_ptr->CallBackWaitFlg = 1;
}